#include "participante.h"
#include <QHostAddress>
#include <QStringList>
#include "marcadorpais.h"
#include <QMessageBox>
#include "telajogo.h"
#include "valordados.h"
#include "mensagem.h"
#include "enviadormensagem.h"

Participante *Participante::instance = NULL;

Participante::Participante(QString nome, QString endereco_ip, int porta_conexao)
{
    this->nome = nome;
    this->socket = new QTcpSocket(this);
    this->socket->connectToHost(QHostAddress(endereco_ip), porta_conexao, QTcpSocket::ReadWrite);
    connect (this->socket, SIGNAL(readyRead()), this, SLOT(processaPacote()));
    connect (this, SIGNAL(trocaJogadorAtivo(QString)), this, SLOT (processaTrocaJogador(QString)));
    connect (this->socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(erro(QAbstractSocket::SocketError)));
    Participante::instance = this;
    this->jogador_atual = "";
    this->aviso_vez_jogador = new QMessageBox(TelaJogo::instance);
    this->aviso_vez_jogador->setGeometry((1200 - this->aviso_vez_jogador->size().width())/2, 200,
                                         this->aviso_vez_jogador->size().width(), this->aviso_vez_jogador->size().height());
    this->mensageiro = new EnviadorMensagem(this);
    this->mensageiro->start(QThread::NormalPriority);
}

void Participante::processaPacote()
{
    while (this->socket->bytesAvailable() != 0) {

        QDataStream in(this->socket);
        in.setVersion(QDataStream::Qt_4_0);
        QString text;
        in >> text;
        //cht - pacote de mensagem de chat
        if (text.startsWith("<tipo>cht"))
            this->processaPacoteChat(text.right(text.size() - 9));
        //rtn - pacote de pedido de nome deste jogador
        //nom - pacote que indica o nome do jogador
        else if (text.startsWith("<tipo>rtn"))
            this->enviaMensagem("<tipo>nom<nome>" + this->nome);
        //mob - pacote que envia o objetivo de cada jogador
        else if (text.startsWith("<tipo>mob"))
            emit this->objetivoEntregue(text.right(text.size() - 16));
        //spa - pacote de sorteio de pais
        else if (text.startsWith("<tipo>spa"))
            emit this->paisSorteado(text.right(text.size() - 9));
        //vez - indica mudanca de jogador
        else if (text.startsWith("<tipo>vez"))
            emit this->trocaJogadorAtivo(text.right(text.size() - 9));
        //mtp - indica mudanca nas tropas de um pais - devido a colocacao de soldados
        else if (text.startsWith("<tipo>mtp"))
            emit this->mudancaTropasPais(text.right(text.size() - 9));
        else if (text.startsWith("<tipo>fim")) {
            this->aviso_vez_jogador->setText(text.right(text.size() - 19));
            this->aviso_vez_jogador->show();
            this->jogador_atual = "";
        }
        else if (text.startsWith("<tipo>ona")) {
            this->aviso_vez_jogador->setText(text.right(text.size() - 19));
            this->aviso_vez_jogador->show();
        }
        else if (text.startsWith("<tipo>vda")) {
            emit this->mostrarDados(text.right(text.size() - 9));
        }
        else if (text.startsWith("<tipo>bat")) {
            emit this->paisConquistado(text.right(text.size() - 9));
        }
        else if (text.startsWith("<tipo>cor")) {
            emit this->jogadorAdicionado(text.right(text.size() - 9));
        }
        else
            qDebug () << "desconhecido: " << text;
    }
}

void Participante::enviaMensagem(QString texto)
{
    Mensagem* mensagem = new Mensagem(texto, this->socket);
    this->mensagens.append(mensagem);
}

void Participante::sendMessage (Mensagem* mensagem)
{
    QByteArray block;
    QDataStream out(&block, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_4_0);
    out << mensagem->mensagem;
    mensagem->destinatario->write(block);
}

void Participante::processaPacoteChat(QString texto_pacote)
{
    QString campo_jogador = "<nome_jogador>";
    QString campo_mensagem = "<mensagem>";
    int i = texto_pacote.indexOf(campo_jogador) + campo_jogador.size();
    int j = texto_pacote.indexOf(campo_mensagem) + campo_mensagem.size();
    QString nome = texto_pacote.right(texto_pacote.size() - i).left(texto_pacote.indexOf(campo_mensagem) - campo_jogador.size());
    QString mensagem = texto_pacote.right(texto_pacote.size() - j);
    emit this->novaMensagem(nome, mensagem);
}

void Participante::processaTrocaJogador(QString texto)
{
    QString tag_jogador = "<jogador>";
    QString tag_tropas = "<novas_tropas>";
    QString nome_jogador = texto.split(tag_jogador).at(1);
    nome_jogador = nome_jogador.split(tag_tropas).at(0);
    this->jogador_atual = nome_jogador;
    emit this->atualizarJogadorAtual();

    if (this->nome == nome_jogador) {
        this->aviso_vez_jogador->setText("Sua vez de jogar");
        QString novas_tropas = texto.split(tag_tropas).at(1);
        emit this->tropasRecebidas(novas_tropas.toInt());
    }
    else
        this->aviso_vez_jogador->setText("Vez do jogador " + this->jogador_atual);

    this->aviso_vez_jogador->show();
}

void Participante::enviarMudancasAlocacao(QList<MarcadorPais*> paises_alterados)
{
    //pacote mtp - Mudanca Tropa Pais
    QString texto;
    for (int i = 0; i < paises_alterados.size(); i++) {

        texto = "<tipo>mtp<pais>" + paises_alterados.at(i)->getNomePais() +
                "<numero_tropas>" + QString::number(paises_alterados.at(i)->getNumeroTropas());
        this->enviaMensagem(texto);
    }
}

void Participante::encerrarTurno()
{
    //enc - pacote de encerramento de turno
    QString texto = "<tipo>enc<jogador>" + this->nome;
    this->enviaMensagem(texto);
}
